/**
 * 将扁平化的菜单构建成菜单树
 */
import router from '@/router'
import { useAuthStore } from '@/stores/auth'
import { cloneDeep } from 'lodash-es'

// 引入 views 文件夹下所有 vue 文件
const modules = import.meta.glob('@/views/**/*.vue')

/**
 * 构建路由菜单
 */
export function useRouteMenu() {
  /**
   * 构建扁平路由菜单
   * @param {Array} routers 路由
   * @param {Boolean} raw 是否为原数据 默认false（为true时表示未删减的原数据）
   * @returns {Array} 构建的扁平路由菜单
   */
  const menuFlat = (routers, raw = false) => {
    // 先深拷贝routers防止干扰
    const rawData = cloneDeep(routers)
    if (raw) return rawData
    const flat = rawData.filter((item) => !item.meta.isHide)
    return flat
  }

  /**
   * 构建树形路由菜单
   * @param {Array} routers 路由
   * @param {Boolean} raw 是否为原数据 默认false（为true时表示未删减的原数据）
   * @returns {Array} 构建的树形菜单
   */
  const menuTree = (routers, raw = false) => {
    // 根据 sort 升序排序
    routers.sort((a, b) => a.sort - b.sort)

    const rawData = cloneDeep(routers)

    const tree = []
    const routerMap = {}

    rawData.forEach((item) => {
      // 忽略 isHide 或 isSub 为 true 的路由
      if ((item.meta?.isHide || item.meta?.isSub) && !raw) return

      routerMap[item.name] = item
      if (!item.parent) {
        tree.push(item)
      } else {
        const parent = routerMap[item.parent]
        if (parent) {
          parent.children = parent.children || []
          parent.children.push(item)
        } else {
          tree.push(item) // 未查询到有效父级则默认放置根节点
        }
      }
    })

    return tree
  }

  /**
   * 动态路由注册
   * @param {Array} routers 路由
   */
  const registerRoute = (routers) => {
    // 根据 sort 升序排序
    routers.sort((a, b) => a.sort - b.sort)

    // 缓存路由菜单
    const authStore = useAuthStore()
    authStore.menuFlat = menuFlat(routers)
    authStore.menuFlatRaw = menuFlat(routers, true)
    authStore.menuTree = menuTree(routers)
    authStore.menuTreeRaw = menuTree(routers, true)

    // 注册动态路由
    routers.forEach((item) => {
      // 忽略 isHide 为 true 的路由
      if (item.meta?.isHide) return
      // 构建路由
      if (item.component && typeof item.component == 'string') {
        item.component = modules['/src/views' + item.component + '.vue']
      }
      if (item.meta?.isFull) {
        router.addRoute(item)
      } else {
        router.addRoute('layout', item)
      }
    })

    return routers
  }

  /**
   * 动态路由重置
   */
  const resetRoute = () => {
    const authStore = useAuthStore()
    const menuFlatRaw = authStore.menuFlatRaw
    // 卸载动态路由
    menuFlatRaw.forEach((item) => {
      if (item.name && router.hasRoute(item.name)) {
        router.removeRoute(item.name)
      }
    })
    // 清空路由菜单缓存
    authStore.clearMenu()
  }

  return {
    menuFlat,
    menuTree,
    registerRoute,
    resetRoute
  }
}
